//
//  迭代器模式通用代码.swift
//  IteratorPattern
//
//  Created by mac on 2017/11/15.
//  Copyright © 2017年 RRC. All rights reserved.
//

import Foundation

//抽象迭代器：负责定义访问和遍历元素的接口
protocol Iterator {
    //遍历到下一个元素
    func next() -> AnyObject
    //是否已经遍历到尾部
    func hasNext() -> Bool
    //删除当前指向的元素
    func remove() -> Bool
}

//抽象容器：提供创建具体迭代器角色的接口
protocol Aggregate {
    //是容器必然有元素的增加
    func add(object:AnyObject)
    //减少元素
    func remove(object:AnyObject)
    //由迭代器来遍历所有的元素
    func iterator() -> Iterator
}


//具体迭代器:实现迭代器接口，完成容器元素的遍历。
public class ConcreteIterator:Iterator{
    //集合类型，用于存储需要遍历的集合
    var objList = Array<AnyObject>()
    //定义当前游标
    var cursor = 0
    
    //通过构造函数将需要遍历的集合传过来
    init(objList:[AnyObject]) {
        self.objList = objList
    }
    
    func next() -> AnyObject {
        var obj:AnyObject? = nil
        if self.hasNext() {
            obj = self.objList[self.cursor]
            self.cursor += 1
        }else{
            obj = nil
        }
        return obj!
    }
    
    func hasNext() -> Bool {
        if self.cursor == self.objList.count {
            return false
        }else{
            return true
        }
    }
    
    func remove() -> Bool {
        self.objList.remove(at: self.cursor)
        return true
    }
    
    
}

//具体容器:实现容器接口定义的方法，创建出容纳迭代器的对象
public class ConcreteAggregate:Aggregate {
    //容纳对晚的容器
    var objArray = [AnyObject]()
    
    //增加一个元素
    func add(object: AnyObject) {
        self.objArray.append(object)
    }
    //删除一个元素
    func remove(object: AnyObject) {
        self.remove(object: object)
    }
    //返回迭代器对象
    func iterator() -> Iterator {
        return ConcreteIterator(objList: self.objArray)
    }
    
    
}

//使用场景类
public class Client{
    public static func main(args:[String]){
        //声明出容器
        let agg:Aggregate = ConcreteAggregate()
        //产生对象数据放进去
        agg.add(object: "abc" as AnyObject)
        agg.add(object: "aaa" as AnyObject)
        agg.add(object: "1234" as AnyObject)
        //遍历一下
        let ierator:Iterator = agg.iterator()
        while ierator.hasNext() {
            print(ierator.next())
        }
    }
}


